From: Isaku Yamahata Date: Fri, 24 Oct 2008 02:38:09 +0000 (+0900) Subject: [IA64] allow __assign_domain_page() to assign real MMIO page over _PAGE_IO. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14062 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=a6225e1b23589fecbfb049da6fb3c02f10ac2884;p=xen.git [IA64] allow __assign_domain_page() to assign real MMIO page over _PAGE_IO. When VTD is enabled on HVM domain, P2M entry may change from _PAGE_IO to real MMIO page. Signed-off-by: Anthony Xu --- diff --git a/xen/arch/ia64/xen/mm.c b/xen/arch/ia64/xen/mm.c index f6a4b7eb1d..9cf861f5eb 100644 --- a/xen/arch/ia64/xen/mm.c +++ b/xen/arch/ia64/xen/mm.c @@ -917,11 +917,19 @@ __assign_domain_page(struct domain *d, old_pte = __pte(0); new_pte = pfn_pte(physaddr >> PAGE_SHIFT, __pgprot(prot)); + again_hvm_page_io: ret_pte = ptep_cmpxchg_rel(&d->arch.mm, mpaddr, pte, old_pte, new_pte); if (pte_val(ret_pte) == pte_val(old_pte)) { smp_mb(); return 0; } + /* in HVM guest, when VTD is enabled, + * P2M entry may change from _PAGE_IO type to real MMIO page + */ + if(VMX_DOMAIN(d->vcpu[0]) && (pte_val(ret_pte) & _PAGE_IO)) { + old_pte = ret_pte; + goto again_hvm_page_io; + } // dom0 tries to map real machine's I/O region, but failed. // It is very likely that dom0 doesn't boot correctly because